import pandas as pd
import numpy as np
import requests
from geopy.geocoders import Nominatim # convert an address into latitude and longitude values
import requests # library to handle requests
from pandas.io.json import json_normalize # tranform JSON file into a pandas dataframe
# Matplotlib and associated plotting modules
import matplotlib.cm as cm
import matplotlib.colors as colors
import folium # map rendering library
import pandas_read_xml as pdx
from minisom import MiniSom
from geopy.geocoders import Nominatim # convert an address into latitude and longitude values
! pip install folium==0.5.0
import folium # plotting library
# import k-means from clustering stage
from sklearn.cluster import KMeans
from sklearn import preprocessing, cluster
import scipy
import matplotlib.pyplot as plt
import seaborn as sns
print('Folium installed')
print('Libraries imported.')
Requirement already satisfied: folium==0.5.0 in /Users/maxim/opt/anaconda3/lib/python3.8/site-packages (0.5.0) Requirement already satisfied: branca in /Users/maxim/opt/anaconda3/lib/python3.8/site-packages (from folium==0.5.0) (0.4.2) Requirement already satisfied: requests in /Users/maxim/opt/anaconda3/lib/python3.8/site-packages (from folium==0.5.0) (2.24.0) Requirement already satisfied: jinja2 in /Users/maxim/opt/anaconda3/lib/python3.8/site-packages (from folium==0.5.0) (2.11.2) Requirement already satisfied: six in /Users/maxim/opt/anaconda3/lib/python3.8/site-packages (from folium==0.5.0) (1.15.0) Requirement already satisfied: chardet<4,>=3.0.2 in /Users/maxim/opt/anaconda3/lib/python3.8/site-packages (from requests->folium==0.5.0) (3.0.4) Requirement already satisfied: certifi>=2017.4.17 in /Users/maxim/opt/anaconda3/lib/python3.8/site-packages (from requests->folium==0.5.0) (2020.6.20) Requirement already satisfied: idna<3,>=2.5 in /Users/maxim/opt/anaconda3/lib/python3.8/site-packages (from requests->folium==0.5.0) (2.10) Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /Users/maxim/opt/anaconda3/lib/python3.8/site-packages (from requests->folium==0.5.0) (1.25.11) Requirement already satisfied: MarkupSafe>=0.23 in /Users/maxim/opt/anaconda3/lib/python3.8/site-packages (from jinja2->folium==0.5.0) (1.1.1) Folium installed Libraries imported.
CLIENT_ID = '...' #Key for working with the geocoder
prep_pools = pd.read_excel('Pools/pools.xlsx')
prep_pools.head()
| global_id | ObjectName | NameWinter | PhotoWinter | AdmArea | District | Address | WebSite | HelpPhone | ... | DimensionsWinter | Lighting | SurfaceTypeWinter | Seats | Paid | PaidComments | DisabilityFriendly | ServicesWinter | geodata_center | geoarea | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 282897592 | Физкультурно-оздоровительный комплекс с бассей... | бассейн плавательный 25-ти метровый крытый | Photo:126e8a14-8169-4b05-b424-51b812da6a5e\n\n | Северо-Восточный административный округ | Алтуфьевский район | Инженерная улица, дом 5, корпус 1 | s82@mossport.ru | s82.mossport.ru | (499) 900-90-18 | ... | Square:350\nLength:25\nWidth:14\nDepth:1.8\n\n | смешанное освещение | специальное покрытие | 0 | платно | NaN | частично приспособлен | общая физическая подготовка | 01010000003C66FB9505CA4240CCB560568EF04B40 | NaN |
| 1 | 407157820 | Фитнес клуб «Ворлд Класс» | бассейн плавательный крытый | Photo:c173e2b2-2d62-4017-9d66-003c6c291985\n\n | Центральный административный округ | район Якиманка | Житная улица, дом 14, строение 1 | NaN | www.worldclass.ru/clubs/zhitnaya/detail | (495) 771-66-00 | ... | Square:60\nLength:15\nWidth:4\nDepth:\n\n | освещение газоразрядными лампами | специальное покрытие | 0 | платно | NaN | NaN | общая физическая подготовка | 0101000000479DC225D0CE4240A666ECCDA2DD4B40 | NaN |
| 2 | 407158063 | Спортивный комплекс высшего учебного заведения... | бассейн плавательный 50-ти метровый крытый | Photo:73775081-f3f9-4286-9e78-b296d8914ab2\n\n | Центральный административный округ | Басманный район | Госпитальная набережная, дом 4, строение 2 | NaN | bmstu.ru | (499) 263-22-37 | ... | Square:1250\nLength:50\nWidth:25\nDepth:\n\n | освещение газоразрядными лампами | специальное покрытие | 0 | платно | NaN | частично приспособлен | общая физическая подготовка | 01010000004E336D2150D94240AF0469CAD7E24B40 | NaN |
| 3 | 407173850 | Спортивный комплекс высшего учебного заведения... | бассейн плавательный 25-ти метровый крытый | Photo:3f8a082f-f943-4758-88e7-d296bceb5393\n\n | Северо-Восточный административный округ | район Марьина Роща | Новосущёвская улица, дом 24, строение 1 | tu@miit.ru | www.miit.ru | (495) 684-40-25 | ... | Square:350\nLength:25\nWidth:14\nDepth:\n\n | освещение лампами накаливания | специальное покрытие | 0 | платно | NaN | частично приспособлен | общая физическая подготовка | 0101000000312ECF7B63CD424013FB5FA123E54B40 | NaN |
| 4 | 407193269 | Фитнес клуб «Ворлд Класс» | бассейн плавательный 25-ти метровый крытый | Photo:f880b17d-a87f-4a5a-ac4e-41be68d851b0\n\n | Южный административный округ | Донской район | Варшавское шоссе, дом 12А | NaN | www.worldclass.ru/clubs/tulskaya/detail/ | (495) 633-03-03 | ... | Square:125\nLength:25\nWidth:5\nDepth:\n\n | смешанное освещение | специальное покрытие | 0 | платно | NaN | не приспособлен | общая физическая подготовка | 0101000000C12C000716CF4240FEF9164C3AD94B40 | NaN |
5 rows × 35 columns
prep_pools.drop(['global_id', 'PhotoWinter', 'Email', 'WebSite', 'HelpPhone', 'NameWinter',
'HelpPhoneExtension', 'WorkingHoursWinter', 'ClarificationOfWorkingHoursWinter',
'HasEquipmentRental', 'EquipmentRentalComments', 'HasTechService', 'DisabilityFriendly',
'TechServiceComments', 'Lighting', 'SurfaceTypeWinter', 'geodata_center', 'geoarea',
'UsagePeriodWinter', 'DimensionsWinter', 'Seats', 'Paid', 'PaidComments', 'HasDressingRoom',
'HasEatery', 'HasToilet', 'HasWifi', 'HasCashMachine', 'HasFirstAidPost', 'HasMusic', 'ServicesWinter'], axis=1, inplace = True)
prep_pools.head()
| ObjectName | AdmArea | District | Address | |
|---|---|---|---|---|
| 0 | Физкультурно-оздоровительный комплекс с бассей... | Северо-Восточный административный округ | Алтуфьевский район | Инженерная улица, дом 5, корпус 1 |
| 1 | Фитнес клуб «Ворлд Класс» | Центральный административный округ | район Якиманка | Житная улица, дом 14, строение 1 |
| 2 | Спортивный комплекс высшего учебного заведения... | Центральный административный округ | Басманный район | Госпитальная набережная, дом 4, строение 2 |
| 3 | Спортивный комплекс высшего учебного заведения... | Северо-Восточный административный округ | район Марьина Роща | Новосущёвская улица, дом 24, строение 1 |
| 4 | Фитнес клуб «Ворлд Класс» | Южный административный округ | Донской район | Варшавское шоссе, дом 12А |
missing_data = prep_pools.isnull()
for column in missing_data.columns.values.tolist():
print(column)
print (missing_data[column].value_counts())
print("")
ObjectName False 472 Name: ObjectName, dtype: int64 AdmArea False 472 Name: AdmArea, dtype: int64 District False 472 Name: District, dtype: int64 Address False 472 Name: Address, dtype: int64
prep_pools['Category'] = 'Pools'
prep_pools['Longitude'] = ''
prep_pools['Latitude'] = ''
for index, row in prep_pools.iterrows():
try:
address = 'Москва,' + row['Address']
url = 'https://geocode-maps.yandex.ru/1.x/?format=json&apikey={}&geocode={}'.format(CLIENT_ID, address)
results = requests.get(url).json()
venue = results['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['Point']['pos']
res = venue.split(sep=" ")
prep_pools['Latitude'][index] = res[1]
prep_pools['Longitude'][index] = res[0]
except:
prep_pools['Latitude'][index] = 'Nan'
prep_pools['Longitude'][index] = 'Nan'
prep_pools.head(10)
| ObjectName | AdmArea | District | Address | Category | Longitude | Latitude | |
|---|---|---|---|---|---|---|---|
| 0 | Физкультурно-оздоровительный комплекс с бассей... | Северо-Восточный административный округ | Алтуфьевский район | Инженерная улица, дом 5, корпус 1 | Pools | 37.578298 | 55.879303 |
| 1 | Фитнес клуб «Ворлд Класс» | Центральный административный округ | район Якиманка | Житная улица, дом 14, строение 1 | Pools | 37.615632 | 55.730978 |
| 2 | Спортивный комплекс высшего учебного заведения... | Центральный административный округ | Басманный район | Госпитальная набережная, дом 4, строение 2 | Pools | 37.696642 | 55.771753 |
| 3 | Спортивный комплекс высшего учебного заведения... | Северо-Восточный административный округ | район Марьина Роща | Новосущёвская улица, дом 24, строение 1 | Pools | 37.604610 | 55.790140 |
| 4 | Фитнес клуб «Ворлд Класс» | Южный административный округ | Донской район | Варшавское шоссе, дом 12А | Pools | 37.617860 | 55.697138 |
| 5 | Фитнес-клуб «Пирамида» | Юго-Западный административный округ | Академический район | улица Дмитрия Ульянова, дом 31 | Pools | 37.585440 | 55.684726 |
| 6 | Физкультурно-оздоровительный комплекс с бассей... | Северо-Восточный административный округ | район Лианозово | Абрамцевская улица, дом 15, корпус 1 | Pools | 37.571525 | 55.906749 |
| 7 | Спортивный комплекс «Тушино» | Северо-Западный административный округ | район Северное Тушино | улица Вилиса Лациса, домовладение 8 | Pools | 37.427094 | 55.865384 |
| 8 | Спортивный комплекс «Аквамарин» | Северо-Западный административный округ | район Митино | улица Рословка, домовладение 5 | Pools | 37.366583 | 55.831433 |
| 9 | Спортивный комплекс «Косино» | Восточный административный округ | район Косино-Ухтомский | улица Николая Старостина, дом 8А | Pools | 37.853093 | 55.729731 |
prep_pools.at[35, 'Longitude'] = 37.617959
prep_pools.at[35, 'Latitude'] = 55.898765
prep_pools.at[61, 'Longitude'] = 37.700828
prep_pools.at[61, 'Latitude'] = 55.793288
prep_pools.at[220, 'Longitude'] = 37.429986
prep_pools.at[220, 'Latitude'] = 55.658764
prep_pools.at[317, 'Longitude'] = 37.480849
prep_pools.at[317, 'Latitude'] = 55.621648
prep_pools.at[318, 'Longitude'] = 37.480849
prep_pools.at[318, 'Latitude'] = 55.621648
prep_pools["Longitude"] = pd.to_numeric(prep_pools["Longitude"])
prep_pools["Latitude"] = pd.to_numeric(prep_pools["Latitude"])
address = 'Moscow, RU'
geolocator = Nominatim(user_agent="moscow_explorer")
location = geolocator.geocode(address)
latitude = location.latitude
longitude = location.longitude
# create map of Moscow using latitude and longitude values
map_moscow = folium.Map(location=[latitude, longitude], zoom_start=10)
# add markers to map
for lat, lng, name in zip(prep_pools['Latitude'], prep_pools['Longitude'], prep_pools['ObjectName']):
label = '{}'.format(name)
label = folium.Popup(label, parse_html=True)
folium.CircleMarker(
[lat, lng],
radius=5,
popup=label,
color='blue',
fill=True,
fill_color='#3186cc',
fill_opacity=0.7,
parse_html=False).add_to(map_moscow)
map_moscow
prep_xml_adulthospitals = pdx.read_xml('AdultHospitals/adulthospital.xml', ['catalog'], encoding='windows-1251')
prep_xml_adulthospitals = pdx.flatten(prep_xml_adulthospitals)
prep_xml_adulthospitals.head()
| array|ChiefPosition | array|ReopenDate | array|ClarificationWorkingHours | array|Category | array|Email | array|PaidServiceInfo | array|ShortName | array|CloseFlag | array|CloseDate | array|Specialization | ... | array|WorkingHours | array|OrgInfo | array|FullName | array|ChiefGender | array|Fax | array|Extrainfo | array|ChiefName | array|ObjectAddress | array|geodata_center | array|DrugStore | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | главный врач | None | None | Больница взрослая | {'Email': 'gkb24@zdrav.mos.ru'} | оказываются | ГБУЗ ГКБ № 24 ДЗМ | действует | None | многопрофильное медицинское учреждение | ... | [{'DayWeek': 'понедельник', 'WorkHours': 'круг... | {'OGRN': '1037739726771', 'ChiefPosition': 'гл... | Государственное бюджетное учреждение здравоохр... | мужской | {'Fax': '(495) 613-04-34'} | None | Родоман Григорий Владимирович | [{'Availability': {'available_o': 'частично', ... | NaN | NaN |
| 1 | заведующий филиалом | None | None | Больница взрослая | {'Email': 'gb17@zdrav.mos.ru'} | отсутствуют | ГБУЗ ГКБ № 17 ДЗМ Филиал «Внуковский» | действует | None | многопрофильное медицинское учреждение | ... | [{'DayWeek': 'понедельник', 'WorkHours': '08:0... | {'OGRN': '1027739805114', 'ChiefPosition': 'гл... | Государственное бюджетное учреждение здравоохр... | женский | {'Fax': '(495) 736-62-34'} | None | Словеснова Ираида Викторовна | {'Availability': {'available_o': 'частично', '... | {'type': 'geometry', 'value': '01010000001FA88... | NaN |
| 2 | главный врач | None | None | Больница взрослая | {'Email': 'gkb31@zdrav.mos.ru'} | оказываются | ГБУЗ ГКБ № 31 ДЗМ | действует | None | многопрофильное медицинское учреждение | ... | [{'DayWeek': 'понедельник', 'WorkHours': 'круг... | {'OGRN': '1037700216069', 'ChiefPosition': 'гл... | Государственное бюджетное учреждение здравоохр... | женский | {'Fax': '(499) 432-08-15'} | None | Ефремова Наталья Михайловна | [{'Availability': {'available_o': 'частично', ... | {'type': 'geometry', 'value': '0101000000590D9... | NaN |
| 3 | заведующий филиалом | None | None | Больница взрослая | {'Email': 'gkbb@zdrav.mos.ru'} | оказываются | ГБУЗ ГКБ им. С. П. Боткина филиал № 1 ДЗМ офта... | действует | None | офтальмология | ... | [{'DayWeek': 'понедельник', 'WorkHours': '08:0... | {'OGRN': '1037739085900', 'ChiefPosition': 'гл... | Государственное бюджетное учреждение здравоохр... | женский | {'Fax': '(495) 699-01-31'} | None | Аржиматова Гульжияна Шевкетовна | [{'Availability': {'available_o': 'полностью',... | NaN | NaN |
| 4 | главный врач | None | None | Больница взрослая | {'Email': 'vgb@zdrav.mos.ru'} | оказываются | ГБУЗ Вороновская больница ДЗМ | действует | None | многопрофильное медицинское учреждение | ... | [{'DayWeek': 'понедельник', 'WorkHours': 'круг... | {'OGRN': '1035011457612', 'ChiefPosition': 'гл... | Государственное бюджетное учреждение здравоохр... | мужской | {'Fax': '(495) 850-71-75'} | None | Гурин Александр Анатольевич | {'Availability': {'available_o': 'частично', '... | {'type': 'geometry', 'value': '0101000000527B5... | NaN |
5 rows × 27 columns
prep_xml_adulthospitals = prep_xml_adulthospitals.reset_index()
prep_xml_adulthospitals.index
RangeIndex(start=0, stop=44, step=1)
data = []
for number in range(44):
try:
data.append([prep_xml_adulthospitals['array|ShortName'][number], 'None', 'None', prep_xml_adulthospitals['array|ObjectAddress'][number][0]['Address'], 'AdultHospital'])
except KeyError:
data.append([prep_xml_adulthospitals['array|ShortName'][number], 'None', 'None', prep_xml_adulthospitals['array|ObjectAddress'][number]['Address'], 'AdultHospital'])
prep_adulthospitals = pd.DataFrame(data, columns=['ObjectName', 'AdmArea', 'District', 'Address', 'Category'])
prep_adulthospitals.head()
| ObjectName | AdmArea | District | Address | Category | |
|---|---|---|---|---|---|
| 0 | ГБУЗ ГКБ № 24 ДЗМ | None | None | город Москва, Писцовая улица, дом 10 | AdultHospital |
| 1 | ГБУЗ ГКБ № 17 ДЗМ Филиал «Внуковский» | None | None | город Москва, поселение Внуковское, посёлок Вн... | AdultHospital |
| 2 | ГБУЗ ГКБ № 31 ДЗМ | None | None | город Москва, улица Лобачевского, дом 42, стро... | AdultHospital |
| 3 | ГБУЗ ГКБ им. С. П. Боткина филиал № 1 ДЗМ офта... | None | None | город Москва, Мамоновский переулок, дом 7, стр... | AdultHospital |
| 4 | ГБУЗ Вороновская больница ДЗМ | None | None | город Москва, поселение Вороновское, посёлок Л... | AdultHospital |
prep_adulthospitals['Longitude'] = ''
prep_adulthospitals['Latitude'] = ''
for index, row in prep_adulthospitals.iterrows():
try:
address = row['Address']
url = 'https://geocode-maps.yandex.ru/1.x/?format=json&apikey={}&geocode={}'.format(CLIENT_ID, address)
results = requests.get(url).json()
venue = results['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['Point']['pos']
res = venue.split(sep=" ")
prep_adulthospitals['Latitude'][index] = res[1]
prep_adulthospitals['Longitude'][index] = res[0]
except:
prep_adulthospitals['Latitude'][index] = 'Nan'
prep_adulthospitals['Longitude'][index] = 'Nan'
prep_adulthospitals.head()
| ObjectName | AdmArea | District | Address | Category | Longitude | Latitude | |
|---|---|---|---|---|---|---|---|
| 0 | ГБУЗ ГКБ № 24 ДЗМ | None | None | город Москва, Писцовая улица, дом 10 | AdultHospital | 37.578945 | 55.798318 |
| 1 | ГБУЗ ГКБ № 17 ДЗМ Филиал «Внуковский» | None | None | город Москва, поселение Внуковское, посёлок Вн... | AdultHospital | 37.270948 | 55.636397 |
| 2 | ГБУЗ ГКБ № 31 ДЗМ | None | None | город Москва, улица Лобачевского, дом 42, стро... | AdultHospital | 37.501034 | 55.669691 |
| 3 | ГБУЗ ГКБ им. С. П. Боткина филиал № 1 ДЗМ офта... | None | None | город Москва, Мамоновский переулок, дом 7, стр... | AdultHospital | 37.598645 | 55.767043 |
| 4 | ГБУЗ Вороновская больница ДЗМ | None | None | город Москва, поселение Вороновское, посёлок Л... | AdultHospital | 37.185357 | 55.313629 |
prep_adulthospitals["Longitude"] = pd.to_numeric(prep_adulthospitals["Longitude"])
prep_adulthospitals["Latitude"] = pd.to_numeric(prep_adulthospitals["Latitude"])
address = 'Moscow, RU'
geolocator = Nominatim(user_agent="moscow_explorer")
location = geolocator.geocode(address)
latitude = location.latitude
longitude = location.longitude
# create map of Moscow using latitude and longitude values
map_moscow = folium.Map(location=[latitude, longitude], zoom_start=10)
# add markers to map
for lat, lng, name in zip(prep_adulthospitals['Latitude'], prep_adulthospitals['Longitude'], prep_adulthospitals['ObjectName']):
label = '{}'.format(name)
label = folium.Popup(label, parse_html=True)
folium.CircleMarker(
[lat, lng],
radius=5,
popup=label,
color='blue',
fill=True,
fill_color='#3186cc',
fill_opacity=0.7,
parse_html=False).add_to(map_moscow)
map_moscow
prep_xml_adultdentalcare = pdx.read_xml('AdultDentalСare/adultdentalcare.xml', ['catalog'], encoding='windows-1251')
prep_xml_adultdentalcare = pdx.flatten(prep_xml_adultdentalcare)
prep_xml_adultdentalcare.head()
| array|ChiefPosition | array|ReopenDate | array|ClarificationWorkingHours | array|AmbulanceStation | array|Category | array|Email | array|PaidServiceInfo | array|ShortName | array|CloseFlag | array|CloseDate | ... | array|OrgInfo | array|DrugStore | array|DoctorsSpecialtiesListForSelfRecording | array|FullName | array|ChiefGender | array|Fax | array|Extrainfo | array|ChiefName | array|ObjectAddress | array|geodata_center | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | главный врач | None | None | нет | Стоматологическая поликлиника взрослая | {'Email': 'sp7@zdrav.mos.ru'} | оказываются | ГАУЗ СП № 7 ДЗМ | действует | None | ... | {'OGRN': '1037736032069', 'ChiefPosition': 'гл... | нет | [Врач-стоматолог-терапевт, Врач-стоматолог-хир... | Государственное автономное учреждение здравоох... | мужской | {'Fax': '(499) 137-63-29'} | Проезд: м. «Ленинский проспект», две остановки... | Вартанов Олег Игоревич | {'Availability': {'available_o': 'частично', '... | NaN |
| 1 | главный врач | None | None | нет | Стоматологическая поликлиника взрослая | {'Email': 'sp24@zdrav.mos.ru'} | отсутствуют | ГАУЗ СП № 24 ДЗМ. Ортопедическое отделение | действует | None | ... | {'OGRN': '1037726012686', 'ChiefPosition': 'гл... | нет | [Врач-стоматолог-терапевт, Врач-стоматолог-хир... | Государственное автономное учреждение здравоох... | мужской | {'Fax': '(499) 610-73-52'} | None | Гринев Андрей Валентинович | {'Availability': {'available_o': 'частично', '... | NaN |
| 2 | главный врач | None | None | нет | Стоматологическая поликлиника взрослая | {'Email': 'info@wgb.mosgorzdrav.ru'} | оказываются | ГБУЗ ЩГБ ДЗМ. Стоматологическая поликлиника | действует | None | ... | {'OGRN': '1035011454400', 'ChiefPosition': 'гл... | нет | [Врач-стоматолог-терапевт, Врач-стоматолог-хир... | Государственное бюджетное учреждение здравоохр... | женский | {'Fax': '(495) 867-02-79'} | None | Лисицина Елена Вадимовна | {'Availability': {'available_o': 'частично', '... | NaN |
| 3 | главный врач | None | None | нет | Стоматологическая поликлиника взрослая | {'Email': 'SP19@zdrav.mos.ru'} | оказываются | ГАУЗ СП № 19 ДЗМ | действует | None | ... | {'OGRN': '1027700299274', 'ChiefPosition': 'гл... | нет | [Врач-стоматолог-терапевт, Врач-стоматолог-хир... | Государственное автономное учреждение здравоох... | женский | {'Fax': '(499) 246-16-72'} | Проезд: м. «Фрунзенская».\nОт станции метро &q... | Остроухова Алла Александровна | {'Availability': {'available_o': 'полностью', ... | NaN |
| 4 | исполняющий обязанности главного врача | None | None | нет | Стоматологическая поликлиника взрослая | {'Email': 'sp3@zdrav.mos.ru'} | оказываются | ГАУЗ СП № 3 ДЗМ | действует | None | ... | {'OGRN': '1037700123042', 'ChiefPosition': 'ис... | нет | [Врач-стоматолог-терапевт, Врач-стоматолог-хир... | Государственное автономное учреждение здравоох... | женский | {'Fax': '(499) 236-52-93'} | Проезд:ст.м.Серпуховская,с выходом к экономиче... | Могучева Людмила Викторовна | {'Availability': {'available_o': 'частично', '... | NaN |
5 rows × 32 columns
prep_xml_adultdentalcare.index
RangeIndex(start=0, stop=67, step=1)
data = []
for number in range(67):
try:
data.append([prep_xml_adultdentalcare['array|ShortName'][number], 'None', 'None', prep_xml_adultdentalcare['array|ObjectAddress'][number][0]['Address'], 'AdultDentalClinic'])
except KeyError:
data.append([prep_xml_adultdentalcare['array|ShortName'][number], 'None', 'None', prep_xml_adultdentalcare['array|ObjectAddress'][number]['Address'], 'AdultDentalClinic'])
prep_adultdentalcare = pd.DataFrame(data, columns=['ObjectName', 'AdmArea', 'District', 'Address', 'Category'])
prep_adultdentalcare.head()
| ObjectName | AdmArea | District | Address | Category | |
|---|---|---|---|---|---|
| 0 | ГАУЗ СП № 7 ДЗМ | None | None | город Москва, Ленинский проспект, дом 40 | AdultDentalClinic |
| 1 | ГАУЗ СП № 24 ДЗМ. Ортопедическое отделение | None | None | город Москва, Симферопольский бульвар, дом 15,... | AdultDentalClinic |
| 2 | ГБУЗ ЩГБ ДЗМ. Стоматологическая поликлиника | None | None | город Москва, город Щербинка, Театральная улиц... | AdultDentalClinic |
| 3 | ГАУЗ СП № 19 ДЗМ | None | None | город Москва, Олсуфьевский переулок, дом 1, ст... | AdultDentalClinic |
| 4 | ГАУЗ СП № 3 ДЗМ | None | None | город Москва, улица Щипок, дом 6/8 | AdultDentalClinic |
prep_adultdentalcare['Longitude'] = ''
prep_adultdentalcare['Latitude'] = ''
for index, row in prep_adultdentalcare.iterrows():
try:
address = row['Address']
url = 'https://geocode-maps.yandex.ru/1.x/?format=json&apikey={}&geocode={}'.format(CLIENT_ID, address)
results = requests.get(url).json()
venue = results['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['Point']['pos']
res = venue.split(sep=" ")
prep_adultdentalcare['Latitude'][index] = res[1]
prep_adultdentalcare['Longitude'][index] = res[0]
except:
prep_adultdentalcare['Latitude'][index] = 'Nan'
prep_adultdentalcare['Longitude'][index] = 'Nan'
prep_adultdentalcare["Longitude"] = pd.to_numeric(prep_adultdentalcare["Longitude"])
prep_adultdentalcare["Latitude"] = pd.to_numeric(prep_adultdentalcare["Latitude"])
address = 'Moscow, RU'
geolocator = Nominatim(user_agent="moscow_explorer")
location = geolocator.geocode(address)
latitude = location.latitude
longitude = location.longitude
# create map of Moscow using latitude and longitude values
map_moscow = folium.Map(location=[latitude, longitude], zoom_start=10)
# add markers to map
for lat, lng, name in zip(prep_adultdentalcare['Latitude'], prep_adultdentalcare['Longitude'], prep_adultdentalcare['ObjectName']):
label = '{}'.format(name)
label = folium.Popup(label, parse_html=True)
folium.CircleMarker(
[lat, lng],
radius=5,
popup=label,
color='blue',
fill=True,
fill_color='#3186cc',
fill_opacity=0.7,
parse_html=False).add_to(map_moscow)
map_moscow
prep_xml_childrendentalcare = pdx.read_xml('ChildDentalCare/childdentalcare.xml', ['catalog'], encoding='windows-1251')
prep_xml_childrendentalcare = pdx.flatten(prep_xml_childrendentalcare)
prep_xml_childrendentalcare.head()
| array|ChiefPosition | array|ReopenDate | array|ClarificationWorkingHours | array|AmbulanceStation | array|Category | array|Email | array|PaidServiceInfo | array|ShortName | array|CloseFlag | array|CloseDate | ... | array|OrgInfo | array|DrugStore | array|DoctorsSpecialtiesListForSelfRecording | array|FullName | array|ChiefGender | array|Fax | array|Extrainfo | array|ChiefName | array|ObjectAddress | array|geodata_center | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | главный врач | None | None | нет | Стоматологическая поликлиника детская | {'Email': 'dsp46@zdrav.mos.ru'} | оказываются | ГБУЗ ДСП № 46 ДЗМ | действует | None | ... | {'OGRN': '1037739702880', 'ChiefPosition': 'гл... | нет | [Врач-стоматолог детский, Врач-стоматолог-хирург] | Государственное бюджетное учреждение здравоохр... | мужской | {'Fax': '(495) 303-31-53'} | Проезд: метро «Новогиреево», автобус 211, 141;... | Чуянов Юрий Васильевич | {'Availability': {'available_o': 'частично', '... | NaN |
| 1 | главный врач | None | None | нет | Стоматологическая поликлиника детская | {'Email': 'dsp6@zdrav.mos.ru'} | оказываются | ГБУЗ ДСП № 6 ДЗМ | действует | None | ... | {'OGRN': '1037723020279', 'ChiefPosition': 'гл... | нет | [Врач-стоматолог детский, Врач-стоматолог-хирург] | Государственное бюджетное учреждение здравоохр... | мужской | {'Fax': '(495) 345-93-14'} | Проезд: метро «Братиславская», далее автобус и... | Даллакян Ваграм Феликсович | {'Availability': {'available_o': 'полностью', ... | NaN |
| 2 | главный врач | None | Вне часы работы поликлиники, в выходные и праз... | нет | Стоматологическая поликлиника детская | {'Email': 'dsp54@zdrav.mos.ru'} | оказываются | ГБУЗ ДСП № 54 ДЗМ | действует | None | ... | {'OGRN': '1037700236254', 'ChiefPosition': 'гл... | нет | [Врач-стоматолог детский, Врач-стоматолог-хирург] | Государственное бюджетное учреждение здравоохр... | женский | {'Fax': '(499) 131-32-20'} | Проезд: метро «Проспект Вернадского», далее ав... | Козачук Галина Федоровна | {'Availability': {'available_o': 'полностью', ... | NaN |
| 3 | исполняющий обязанности главного врача | None | None | нет | Стоматологическая поликлиника детская | {'Email': 'sp66@zdrav.mos.ru'} | оказываются | ГАУЗ СП № 66 ДЗМ. Детское отделение | действует | None | ... | {'OGRN': '1037739392250', 'ChiefPosition': 'ис... | нет | [Врач-стоматолог детский, Врач-стоматолог-хирург] | Государственное автономное учреждение здравоох... | мужской | {'Fax': '(495) 674-31-09'} | Проезд: м.Пролетарская, Волгоградский пр-т, Ма... | Баштовой Алексей Александрович | {'Availability': {'available_o': 'частично', '... | NaN |
| 4 | главный врач | None | None | да | Стоматологическая поликлиника детская | {'Email': 'dsp26@zdrav.mos.ru'} | отсутствуют | ГБУЗ ДСП № 26 ДЗМ. Отделение ортодонтии | действует | None | ... | {'OGRN': '1037734011457', 'ChiefPosition': 'гл... | нет | [Врач-стоматолог детский, Врач-стоматолог-хирург] | Государственное бюджетное учреждение здравоохр... | женский | {'Fax': '(499) 190-47-38'} | по полису ОМС.\nПроезд: м. Щукинская, далее пе... | Попова Ольга Леонидовна | {'Availability': {'available_o': 'частично', '... | NaN |
5 rows × 30 columns
prep_xml_childrendentalcare.index
RangeIndex(start=0, stop=40, step=1)
data = []
for number in range(40):
try:
data.append([prep_xml_childrendentalcare['array|ShortName'][number], 'None', 'None', prep_xml_childrendentalcare['array|ObjectAddress'][number][0]['Address'], 'ChildrenDentalClinic'])
except KeyError:
data.append([prep_xml_childrendentalcare['array|ShortName'][number], 'None', 'None', prep_xml_childrendentalcare['array|ObjectAddress'][number]['Address'], 'ChildrenDentalClinic'])
prep_childrendentalcare = pd.DataFrame(data, columns=['ObjectName', 'AdmArea', 'District', 'Address', 'Category'])
prep_childrendentalcare.head()
| ObjectName | AdmArea | District | Address | Category | |
|---|---|---|---|---|---|
| 0 | ГБУЗ ДСП № 46 ДЗМ | None | None | город Москва, Новогиреевская улица, дом 17 | ChildrenDentalClinic |
| 1 | ГБУЗ ДСП № 6 ДЗМ | None | None | город Москва, Марьинский бульвар, дом 10, корп... | ChildrenDentalClinic |
| 2 | ГБУЗ ДСП № 54 ДЗМ | None | None | город Москва, улица Удальцова, дом 4 | ChildrenDentalClinic |
| 3 | ГАУЗ СП № 66 ДЗМ. Детское отделение | None | None | город Москва, Сосинский проезд, дом 8 | ChildrenDentalClinic |
| 4 | ГБУЗ ДСП № 26 ДЗМ. Отделение ортодонтии | None | None | город Москва, улица Маршала Новикова, дом 4, к... | ChildrenDentalClinic |
prep_childrendentalcare['Longitude'] = ''
prep_childrendentalcare['Latitude'] = ''
for index, row in prep_childrendentalcare.iterrows():
try:
address = row['Address']
url = 'https://geocode-maps.yandex.ru/1.x/?format=json&apikey={}&geocode={}'.format(CLIENT_ID, address)
results = requests.get(url).json()
venue = results['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['Point']['pos']
res = venue.split(sep=" ")
prep_childrendentalcare['Latitude'][index] = res[1]
prep_childrendentalcare['Longitude'][index] = res[0]
except:
prep_childrendentalcare['Latitude'][index] = 'Nan'
prep_childrendentalcare['Longitude'][index] = 'Nan'
prep_childrendentalcare["Longitude"] = pd.to_numeric(prep_childrendentalcare["Longitude"])
prep_childrendentalcare["Latitude"] = pd.to_numeric(prep_childrendentalcare["Latitude"])
address = 'Moscow, RU'
geolocator = Nominatim(user_agent="moscow_explorer")
location = geolocator.geocode(address)
latitude = location.latitude
longitude = location.longitude
# create map of Moscow using latitude and longitude values
map_moscow = folium.Map(location=[latitude, longitude], zoom_start=10)
# add markers to map
for lat, lng, name in zip(prep_adultdentalcare['Latitude'], prep_adultdentalcare['Longitude'], prep_adultdentalcare['ObjectName']):
label = '{}'.format(name)
label = folium.Popup(label, parse_html=True)
folium.CircleMarker(
[lat, lng],
radius=5,
popup=label,
color='blue',
fill=True,
fill_color='#3186cc',
fill_opacity=0.7,
parse_html=False).add_to(map_moscow)
map_moscow
prep_xml_childrenhospital = pdx.read_xml('ChildrenHospitals/childrenhospital.xml', ['catalog'], encoding='windows-1251')
prep_xml_childrenhospital = pdx.flatten(prep_xml_childrenhospital)
prep_xml_childrenhospital.head()
| array|ChiefPosition | array|ReopenDate | array|ClarificationWorkingHours | array|Category | array|Email | array|PaidServiceInfo | array|ShortName | array|geodata_center | array|CloseFlag | array|CloseDate | ... | array|BeneficialDrugPrescription | array|geoData | array|WorkingHours | array|OrgInfo | array|FullName | array|ChiefGender | array|Fax | array|Extrainfo | array|ChiefName | array|ObjectAddress | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | главный врач | None | None | Больница детская и специализированная | {'Email': 'info@mdgkb.mosgorzdrav.ru'} | оказываются | ГБУЗ Морозовская ДГКБ ДЗМ | {'type': 'geometry', 'value': '010100000053F31... | действует | None | ... | None | {'coordinates': [{'array': ['37.619745922548',... | [{'DayWeek': 'понедельник', 'WorkHours': 'круг... | {'OGRN': '1027739783620', 'ChiefPosition': 'гл... | Государственное бюджетное учреждение здравоохр... | мужской | {'Fax': '(499) 236-22-13'} | None | Горев Валерий Викторович | [{'Availability': {'available_o': 'частично', ... |
| 1 | главный врач | None | None | Больница детская и специализированная | {'Email': 'gkb67@zdrav.mos.ru'} | отсутствуют | ГБУЗ ГКБ № 67 им. Л. А. Ворохобова ДЗМ. Детско... | NaN | действует | None | ... | None | {'coordinates': {'array': ['37.466007827114', ... | [{'DayWeek': 'понедельник', 'WorkHours': 'круг... | {'OGRN': '1037734010467', 'ChiefPosition': 'гл... | Государственное бюджетное учреждение здравоохр... | мужской | {'Fax': '(495) 530-33-53'} | None | Шкода Андрей Сергеевич | {'Availability': {'available_o': 'полностью', ... |
| 2 | главный врач | None | None | Больница детская и специализированная | {'Email': 'gkb70@zdrav.mos.ru'} | оказываются | ГБУЗ ГКБ им. Е.О. Мухина ДЗМ. Детское отделение | {'type': 'geometry', 'value': '0101000000A9148... | действует | None | ... | None | {'coordinates': {'array': ['37.814071598966', ... | [{'DayWeek': 'понедельник', 'WorkHours': '08:0... | {'OGRN': '1037700233790', 'ChiefPosition': 'гл... | Государственное бюджетное учреждение здравоохр... | мужской | {'Fax': '(495) 303-97-69'} | None | Извеков Александр Александрович | {'Availability': {'available_o': 'частично', '... |
| 3 | исполняющий обязанности главного врача | None | третья суббота месяца с 8:00 до 20:00 | Больница детская и специализированная | {'Email': 'bk@zdrav.mos.ru'} | отсутствуют | ГБУЗ Больница «Кузнечики» ДЗМ. Детское отделение | NaN | действует | None | ... | None | {'coordinates': {'array': ['37.450696233232', ... | [{'DayWeek': 'понедельник', 'WorkHours': '08:0... | {'OGRN': '1035011454741', 'ChiefPosition': 'ис... | Государственное бюджетное учреждение здравоохр... | женский | {'Fax': '(495) 212-14-80'} | None | Карагодина Юлия Яковлевна | {'Availability': {'available_o': 'частично', '... |
| 4 | главный врач | None | None | Больница детская и специализированная | {'Email': 'dgkb9@zdrav.mos.ru'} | оказываются | ГБУЗ ДГКБ № 9 им. Г. Н. Сперанского ДЗМ | NaN | действует | None | ... | None | {'coordinates': [{'array': ['37.539189284171',... | [{'DayWeek': 'понедельник', 'WorkHours': 'круг... | {'OGRN': '1027739190050', 'ChiefPosition': 'гл... | Государственное бюджетное учреждение здравоохр... | мужской | {'Fax': '(499) 256-61-27'} | None | Корсунский Анатолий Александрович | [{'Availability': {'available_o': 'частично', ... |
5 rows × 26 columns
prep_xml_childrenhospital.index
RangeIndex(start=0, stop=15, step=1)
data = []
for number in range(15):
try:
data.append([prep_xml_childrenhospital['array|ShortName'][number], 'None', 'None', prep_xml_childrenhospital['array|ObjectAddress'][number][0]['Address'], 'ChildrenHospital'])
except KeyError:
data.append([prep_xml_childrenhospital['array|ShortName'][number], 'None', 'None', prep_xml_childrenhospital['array|ObjectAddress'][number]['Address'], 'ChildrenHospital'])
prep_childrenhospital = pd.DataFrame(data, columns=['ObjectName', 'AdmArea', 'District', 'Address', 'Category'])
prep_childrenhospital.head()
| ObjectName | AdmArea | District | Address | Category | |
|---|---|---|---|---|---|
| 0 | ГБУЗ Морозовская ДГКБ ДЗМ | None | None | город Москва, 4-й Добрынинский переулок, дом 1... | ChildrenHospital |
| 1 | ГБУЗ ГКБ № 67 им. Л. А. Ворохобова ДЗМ. Детско... | None | None | город Москва, улица Саляма Адиля, дом 2/44 | ChildrenHospital |
| 2 | ГБУЗ ГКБ им. Е.О. Мухина ДЗМ. Детское отделение | None | None | Российская Федерация, город Москва, внутригоро... | ChildrenHospital |
| 3 | ГБУЗ Больница «Кузнечики» ДЗМ. Детское отделение | None | None | город Москва, поселение Щаповское, село Озноби... | ChildrenHospital |
| 4 | ГБУЗ ДГКБ № 9 им. Г. Н. Сперанского ДЗМ | None | None | город Москва, Шмитовский проезд, дом 29, строе... | ChildrenHospital |
prep_childrenhospital['Longitude'] = ''
prep_childrenhospital['Latitude'] = ''
for index, row in prep_childrenhospital.iterrows():
try:
address = row['Address']
url = 'https://geocode-maps.yandex.ru/1.x/?format=json&apikey={}&geocode={}'.format(CLIENT_ID, address)
results = requests.get(url).json()
venue = results['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['Point']['pos']
res = venue.split(sep=" ")
prep_childrenhospital['Latitude'][index] = res[1]
prep_childrenhospital['Longitude'][index] = res[0]
except:
prep_childrenhospital['Latitude'][index] = 'Nan'
prep_childrenhospital['Longitude'][index] = 'Nan'
prep_childrenhospital["Longitude"] = pd.to_numeric(prep_childrenhospital["Longitude"])
prep_childrenhospital["Latitude"] = pd.to_numeric(prep_childrenhospital["Latitude"])
address = 'Moscow, RU'
geolocator = Nominatim(user_agent="moscow_explorer")
location = geolocator.geocode(address)
latitude = location.latitude
longitude = location.longitude
# create map of Moscow using latitude and longitude values
map_moscow = folium.Map(location=[latitude, longitude], zoom_start=10)
# add markers to map
for lat, lng, name in zip(prep_childrenhospital['Latitude'], prep_childrenhospital['Longitude'], prep_childrenhospital['ObjectName']):
label = '{}'.format(name)
label = folium.Popup(label, parse_html=True)
folium.CircleMarker(
[lat, lng],
radius=5,
popup=label,
color='blue',
fill=True,
fill_color='#3186cc',
fill_opacity=0.7,
parse_html=False).add_to(map_moscow)
map_moscow
prep_school = pd.read_csv('EducationData/school_data.csv')
prep_school.head()
| name | adress | lattitude | longitude | |
|---|---|---|---|---|
| 0 | Школа № 1239 | Вспольный переулок, дом 6, строение 3 | 55.760292 | 37.588808 |
| 1 | Школа № 1231 имени В.Д. Поленова | Спасопесковский переулок, дом 6, строение 7 | 55.749866 | 37.589033 |
| 2 | Школа № 1277 с углубленным изучением немецкого... | Сущевская ул., д. 32 | 55.783848 | 37.602067 |
| 3 | Пятьдесят седьмая школа | Малый Знаменский переулок, 7/10 стр. 5 | 55.748615 | 37.604987 |
| 4 | Школа № 1535 | ул. Усачева, д.50 | 55.725803 | 37.564931 |
prep_school['Category'] = 'School'
prep_school['AdmArea'] = ''
prep_school['District'] = ''
prep_school.rename(columns={"name": "ObjectName", "adress": "Address", "lattitude": "Latitude", "longitude": "Longitude"}, inplace = True)
prep_school = prep_school[['ObjectName', 'AdmArea', 'District', 'Address', 'Category', 'Longitude', 'Latitude']]
prep_school.head()
| ObjectName | AdmArea | District | Address | Category | Longitude | Latitude | |
|---|---|---|---|---|---|---|---|
| 0 | Школа № 1239 | Вспольный переулок, дом 6, строение 3 | School | 37.588808 | 55.760292 | ||
| 1 | Школа № 1231 имени В.Д. Поленова | Спасопесковский переулок, дом 6, строение 7 | School | 37.589033 | 55.749866 | ||
| 2 | Школа № 1277 с углубленным изучением немецкого... | Сущевская ул., д. 32 | School | 37.602067 | 55.783848 | ||
| 3 | Пятьдесят седьмая школа | Малый Знаменский переулок, 7/10 стр. 5 | School | 37.604987 | 55.748615 | ||
| 4 | Школа № 1535 | ул. Усачева, д.50 | School | 37.564931 | 55.725803 |
address = 'Moscow, RU'
geolocator = Nominatim(user_agent="moscow_explorer")
location = geolocator.geocode(address)
latitude = location.latitude
longitude = location.longitude
# create map of Moscow using latitude and longitude values
map_moscow = folium.Map(location=[latitude, longitude], zoom_start=10)
# add markers to map
for lat, lng, name in zip(prep_school['Latitude'], prep_school['Longitude'], prep_school['ObjectName']):
label = '{}'.format(name)
label = folium.Popup(label, parse_html=True)
folium.CircleMarker(
[lat, lng],
radius=5,
popup=label,
color='blue',
fill=True,
fill_color='#3186cc',
fill_opacity=0.7,
parse_html=False).add_to(map_moscow)
map_moscow
objects = pd.concat([prep_pools, prep_adulthospitals, prep_adultdentalcare, prep_childrendentalcare, prep_childrenhospital, prep_school], axis=0)
objects.reset_index(inplace = True)
objects.to_csv(r'objects.csv')
for index, row in objects.iterrows():
try:
long = str(objects['Longitude'].iloc[index])
lat = str(objects['Latitude'].iloc[index])
address = long + ',' + lat
print(index, address)
url = 'https://geocode-maps.yandex.ru/1.x/?format=json&apikey={}&geocode={}'.format(CLIENT_ID, address)
results = requests.get(url).json()
objects.at[index, 'AdmArea'] = results['response']['GeoObjectCollection']['featureMember'][2]['GeoObject']['metaDataProperty']['GeocoderMetaData']['Address']['Components'][4]['name']
objects.at[index, 'District'] = results['response']['GeoObjectCollection']['featureMember'][2]['GeoObject']['metaDataProperty']['GeocoderMetaData']['Address']['Components'][5]['name']
except:
print('error')
0 37.578298,55.879303 1 37.615632,55.730978 2 37.696642,55.771753000000004 3 37.60461,55.79014 4 37.61786,55.697138 5 37.585440000000006,55.684726 6 37.571525,55.906749 7 37.427094,55.865384 8 37.366583,55.831433 error 9 37.853093,55.72973100000001 10 37.853093,55.72973100000001 11 37.829799,55.759775 12 37.826017,55.746821 13 37.83359,55.724915 14 37.83359,55.724915 15 37.898008000000004,55.723055 16 37.567464,55.901833999999994 17 37.668597,55.785468 18 37.668597,55.785468 19 37.781524,55.70071 20 37.849571000000005,55.691902 21 37.737893,55.73186 22 37.726071000000005,55.649097999999995 23 37.56017,55.783590000000004 24 37.310375,55.613489 error 25 37.356468,55.832246999999995 26 37.356468,55.832246999999995 27 37.489697,55.882414000000004 28 37.563871,55.86228199999999 29 37.535061999999996,55.887251 30 37.469782,55.878586 31 37.447656,55.791430000000005 32 37.403073,55.646756 33 37.476869,55.67499599999999 34 37.519036,55.60479300000001 35 37.617959,55.898765 36 37.548536999999996,55.550259 37 37.548536999999996,55.550259 38 37.498833000000005,55.646731 39 37.498833000000005,55.646731 40 37.653756,55.883635999999996 41 37.803631,55.80616 42 37.529376,55.680448 43 37.579538,55.78804399999999 44 37.633796000000004,55.83586700000001 45 37.581271,55.782552 46 37.71459,55.754298999999996 47 37.226087,55.986934 error 48 37.483409,55.640828000000006 49 37.849571000000005,55.691902 50 37.737893,55.73186 51 37.683446,55.70129300000001 52 37.353566,55.645461 53 37.411355,55.804481 54 37.731757,55.706766 55 37.487038,55.630878 56 37.581271,55.782552 57 37.565713,55.751406 58 37.457546,55.760408 59 37.347377,55.651663 60 37.509613,55.717284 61 37.700828,55.793288 62 37.501806,55.71334399999999 63 37.438933,55.72828199999999 64 37.558454,55.713069999999995 error 65 37.199595,55.973214 error 66 37.476276,55.844779 67 37.511435999999996,55.531698 68 37.584119,55.765838 69 37.564689,55.835604000000004 70 37.519324,55.876293999999994 71 37.730706,55.788706999999995 72 37.561733000000004,55.782956999999996 73 37.52068,55.798485 74 37.616521,55.629567 75 37.605032,55.640777 76 37.491099,55.851293000000005 77 37.617366,55.696189000000004 78 37.492913,55.61874 79 37.483957000000004,55.832094999999995 80 37.674184000000004,55.58408000000001 81 37.673286,55.628505000000004 82 37.551914000000004,55.843858999999995 83 37.479277,55.837267000000004 84 37.564383,55.847719999999995 85 37.667087,55.875713 86 37.497468,55.823216 87 37.677607,55.870819 88 37.574292,55.814103 89 37.649615000000004,55.707218000000005 90 37.791226,55.704240000000006 91 37.632179,55.866980000000005 92 37.617689,55.820181999999996 93 37.353566,55.645461 94 37.923709,55.685508 95 37.791226,55.704240000000006 96 37.633814,55.670524 97 37.366817,55.84307 98 37.35954,55.850747 99 37.411355,55.804481 100 37.62802,55.719308 101 37.565228000000005,55.885575 102 37.569063,55.852444999999996 103 37.350978999999995,55.598253 104 37.577211,55.611169999999994 105 37.538916,55.807891000000005 106 37.373571999999996,55.592113 107 37.650478,55.581688 108 37.65125,55.811002 109 37.58977,55.889058 110 37.611338,55.635040000000004 111 37.577328,55.798170999999996 112 37.58853,55.807193000000005 113 37.695411,55.65554399999999 error 114 37.483409,55.640828000000006 115 37.457744,55.735251 116 37.516763,55.793971 117 37.66556,55.879541 error 118 37.565228000000005,55.885575 119 37.618426,55.80445 120 37.478226,55.827403000000004 121 37.667204,55.856159 122 37.608401,55.85720500000001 123 37.226087,55.986934 error 124 37.540344,55.79506899999999 125 37.647037,55.822276 126 37.730706,55.788706999999995 127 37.923709,55.685508 128 37.595492,55.635975 129 37.695411,55.65554399999999 error 130 37.570141,55.859867 131 37.501241,55.858054 132 37.730706,55.788706999999995 133 37.534712,55.83221700000001 134 37.54356,55.799572999999995 135 37.611958,55.795914 136 37.7759,55.824238 137 37.29567,55.47152 138 37.29567,55.47152 139 37.852769,55.735443999999994 140 37.586311,55.751229 141 37.555723,55.759409999999995 142 37.555723,55.759409999999995 143 37.771696,55.747296999999996 144 37.742914,55.69175500000001 error 145 37.569719,55.565076 146 37.569719,55.565076 147 37.456271,55.667615000000005 148 37.555822,55.69939599999999 149 37.814115,55.752582 150 37.422863,55.843833 151 37.598133000000004,55.71795899999999 152 37.776745,55.824324 153 37.412756,55.86228199999999 154 37.584685,55.570471999999995 155 37.46008,55.842014 156 37.667959,55.823712 157 37.382834,55.903978 158 37.667959,55.823712 159 37.465011,55.668935 160 37.299703,55.490136 161 37.65602,55.745909 162 37.682179,55.760697 163 37.586311,55.773986 164 37.613341,55.721523 165 37.624049,55.785123999999996 166 37.653936,55.721914 167 37.693723,55.814558 168 37.753928,55.636199 169 37.391628000000004,55.804627 170 37.642806,55.724266 171 37.700568,55.880904 172 37.585583,55.858129000000005 173 37.669477,55.886302 174 37.609002000000004,55.798642 175 37.473715999999996,55.582345 176 37.469737,55.579892 177 37.444521,55.53078000000001 178 37.369403999999996,55.58955400000001 179 37.660844,55.825967000000006 180 37.592878000000006,55.710296 181 37.579538,55.78804399999999 182 37.661922,55.682651 183 37.691207,55.739808 184 37.465532,55.781504000000005 185 37.703595,55.782861 186 37.649319,55.824562 187 37.584685,55.570471999999995 188 37.730247999999996,55.614775 189 37.709272,55.604335999999996 190 37.402983,55.721138 191 37.402983,55.721138 192 37.552193,55.79303 193 37.473051,55.67600600000001 194 37.473051,55.67600600000001 195 37.473051,55.67600600000001 196 37.770232,55.75055 197 37.493542,55.684045999999995 198 37.193217,55.30905799999999 199 37.88978,55.718030000000006 200 37.331288,55.501631 201 37.653343,55.70211 202 37.653343,55.70211 203 37.511266,55.447979000000004 204 37.579744,55.690654 205 37.632179,55.866980000000005 206 37.592509,55.776931999999995 error 207 37.588898,55.760692000000006 208 37.597315,55.762145 209 37.556101,55.815518999999995 210 37.530822,55.702952 211 37.483104,55.651185999999996 212 37.483104,55.651185999999996 213 37.411014,55.738595999999994 214 37.605777,55.773357999999995 215 37.516449,55.681712 216 37.688584000000006,55.707816 217 37.539087,55.747115 218 37.543255,55.54785 219 37.508229,55.73925500000001 220 37.429986,55.658764 221 37.596552,55.646980000000006 error 222 37.576861,55.664126 223 37.596552,55.646980000000006 error 224 37.527184000000005,55.597246 225 37.440829,55.739017000000004 226 37.549444,55.721392 error 227 37.497656,55.657408 228 37.497656,55.657408 229 37.530165999999994,55.64473 230 37.481648,55.634221999999994 231 37.498841999999996,55.74899 232 37.67687,55.758134 233 37.819657,55.678402 234 37.730437,55.729873 235 37.747738,55.681163 236 37.679565000000004,55.730872 237 37.61715,55.736523 238 37.621471,55.759912 239 37.626096999999994,55.74823000000001 error 240 37.568065999999995,55.767154000000005 241 37.510601,55.64755400000001 242 37.609586,55.754568000000006 243 37.532646,55.751801 244 37.658536,55.76169 245 37.613448999999996,55.738252 246 37.685907,55.7747 247 37.569134999999996,55.76324 248 37.610988,55.766698999999996 249 37.448465,55.807460999999996 250 37.549004,55.663745 251 37.536526,55.664095999999994 252 37.542770000000004,55.669945 253 37.559523,55.672321 254 37.656191,55.74335 255 37.489868,55.77038 256 37.575828,55.73676700000001 257 37.813423,55.730416000000005 258 37.64772,55.721138 259 37.607529,55.731981999999995 260 37.632826,55.711123 261 37.605912,55.754993000000006 262 37.576879,55.7249 263 37.449011999999996,55.790312 264 37.69401,55.79231600000001 265 37.568478999999996,55.859443000000006 266 37.77105,55.758635 267 37.712488,55.749263 268 37.476805999999996,55.78749200000001 269 37.762965,55.652207 270 37.591162,55.831555 271 37.899113,55.717290000000006 272 37.442895,55.752891000000005 273 37.852724,55.730005000000006 274 37.546974,55.75811899999999 275 37.674490000000006,55.63304300000001 276 37.77105,55.758635 277 37.579852,55.643190000000004 278 37.618749,55.714313 279 37.649741,55.674367000000004 280 37.428019,55.783428 error 281 37.555651,55.936439 282 37.766217,55.652212 283 37.64383,55.761816 284 37.504052,55.74149 285 37.694262,55.81618100000001 286 37.724175,55.880162 287 37.442895,55.752891000000005 288 37.695169,55.853678 289 37.455434999999994,55.735941000000004 290 37.491503,55.705346 291 37.568956,55.743770999999995 292 37.534406,55.750028 293 37.574067,55.730431 294 37.412137,55.723263 295 37.695169,55.853678 296 37.506612,55.715180000000004 297 37.647109,55.762161 298 37.631757,55.678362 299 37.701304,55.634308 300 37.505165999999996,55.737527 301 37.629996000000006,55.728565 302 37.41979,55.75975 303 37.665911,55.781615 304 37.628190000000004,55.730639000000004 305 37.193047,56.01568100000001 error 306 37.480885,55.727231999999994 307 37.496731,55.672428000000004 308 37.192499,55.98071899999999 error 309 37.484963,55.672189 310 37.457546,55.760408 311 37.48614,55.766572 312 37.802931,55.709830000000004 313 37.40592,55.754 314 37.76468,55.673747 315 37.500136,55.776531999999996 316 37.648789,55.729147999999995 317 37.480849,55.621648 318 37.480849,55.621648 319 37.521821,55.544484 320 37.665911,55.781615 321 37.649291999999996,55.88555899999999 322 37.424129,55.748630000000006 323 37.447656,55.791430000000005 324 37.584281,55.892526000000004 325 37.690614000000004,55.778902 326 37.624543,55.757957 327 37.505175,55.857488000000004 328 37.665911,55.781615 329 37.440829,55.739017000000004 330 37.57563,55.729524 331 37.438933,55.72828199999999 332 37.491170000000004,55.735519999999994 333 37.731227000000004,55.683446999999994 334 37.700568,55.880904 335 37.415874,55.839689 336 37.647037,55.822276 337 37.561949,55.689563 338 37.638108,55.800104000000005 error 339 37.699705,55.87759200000001 340 37.491503,55.705346 341 37.505165999999996,55.737527 342 37.701304,55.634308 343 37.556388,55.754203000000004 344 37.503370000000004,55.860928 345 37.687587,55.735606000000004 346 37.730706,55.788706999999995 347 37.803631,55.80616 348 37.591162,55.831555 349 37.730706,55.788706999999995 350 37.691207,55.739808 351 37.646381,55.70315 352 37.563871,55.86228199999999 353 37.613099,55.888881000000005 354 37.618516,55.739727 355 37.78739,55.789143 356 37.866334,55.82012099999999 error 357 37.618354,55.818881999999995 358 37.516763,55.793971 359 37.357851000000004,55.834233999999995 360 37.701403000000006,55.876324 361 37.70735,55.615802 362 37.478226,55.827403000000004 363 37.858204,55.681965000000005 364 37.670761999999996,55.87339 365 37.822801,55.757977000000004 366 37.710144,55.876304000000005 367 37.546974,55.75811899999999 368 37.641333,55.87891 369 37.360717,55.840614 370 37.604843,55.618491000000006 371 37.157697999999996,55.979923 error 372 37.420653,55.749683999999995 373 37.715812,55.617342 374 37.339975,55.636880000000005 375 37.686437,55.731759 376 37.465901,55.81995500000001 377 37.580957,55.675357 378 37.681281,55.81059200000001 error 379 37.599328,55.736686 380 37.383767999999996,55.839158 381 37.533418,55.726791000000006 382 37.428297,55.721047 383 37.670142,55.714043999999994 384 37.591602,55.668615 385 37.71583,55.680707 386 37.507403000000004,55.756928 387 37.43932,55.718571999999995 388 37.445707,55.725473 389 37.509352,55.661333 390 37.548823999999996,55.760899 391 37.548823999999996,55.760899 392 37.398383,55.617321999999994 393 37.188384,55.99784399999999 error 394 37.548823999999996,55.760899 395 37.574372,55.512561 error 396 37.447926,55.818392 397 37.834875,55.742473 398 37.516449,55.681712 399 37.717735,55.761219 400 37.856704,55.73358399999999 401 37.558706,55.677204 402 37.339831,55.647391000000006 403 37.357789000000004,55.595689 404 37.337441999999996,55.646289 405 37.581882,55.663771 406 37.339975,55.636880000000005 407 37.579035,55.50240600000001 408 37.698421,55.616417000000006 409 37.809191999999996,55.726836999999996 410 37.491512,55.674951 411 37.438888,55.564216 412 37.484253,55.79891 413 37.647558000000004,55.812757 414 37.445707,55.725473 415 37.587757,55.870757999999995 416 37.787794,55.79166800000001 417 37.294691,55.428383 418 37.713962,55.621409 419 37.404410999999996,55.83826800000001 420 37.675109,55.710692 421 37.410097,55.570131 422 37.677463,55.723486 423 37.211721999999995,55.30963199999999 424 37.410097,55.570131 425 37.581092,55.609512 426 37.421496999999995,55.74149 427 37.557897,55.796886 428 37.445644,55.524702000000005 429 37.720304,55.786758999999996 430 37.294691,55.428383 431 37.647558000000004,55.812757 432 37.613737,55.650206000000004 error 433 37.536454,55.943658 434 37.58764,55.862863 435 37.357789000000004,55.595689 436 37.832692,55.818447 437 37.454636,55.589197999999996 438 37.438888,55.564216 439 37.818849,55.82503199999999 440 37.720304,55.786758999999996 441 37.523061,55.83030600000001 442 37.646417,55.712731000000005 443 37.589707000000004,55.570299 444 37.711346999999996,55.602205000000005 445 37.868992999999996,55.816782999999994 error 446 37.904665,55.719986999999996 447 37.570537,55.729676 448 37.504483,55.860827 449 37.163213,55.977622 error 450 37.499695,55.703753000000006 451 37.402983,55.721138 452 37.704412,55.75836700000001 453 37.470464,55.829632999999994 454 37.390146,55.883858 455 37.645178,55.875173 456 37.449011999999996,55.790312 457 37.470464,55.829632999999994 458 37.702562,55.793206999999995 459 37.832018,55.812438 460 37.688755,55.73699499999999 461 37.543928,55.78636899999999 462 37.577903000000006,55.726076 463 37.569782000000004,55.764065 464 37.601915000000005,55.77539300000001 465 37.599928999999996,55.768733999999995 466 37.671462,55.77385400000001 467 37.681146000000005,55.787447 468 37.566728000000005,55.787376 469 37.498213,55.868304 470 37.498213,55.868304 471 37.552803999999995,55.937109 472 37.578945000000004,55.798318 473 37.270948,55.636396999999995 474 37.501034000000004,55.669691 475 37.598645,55.76704300000001 476 37.185357,55.313629000000006 477 37.598690000000005,55.719663 478 37.559056,55.688258 479 37.453971,55.815321999999995 480 37.665875,55.864763 481 37.814438,55.756280000000004 482 37.190253000000006,55.413540000000005 483 37.555409000000004,55.812721999999994 484 37.415371,55.642824 485 37.652625,55.616514 486 37.739329999999995,55.790701 487 37.685251,55.79226 488 37.739366,55.77276 489 37.832297,55.729958999999994 490 37.702265999999995,55.767782 491 37.48278,55.743451 492 37.603451,55.724433999999995 493 37.487811,55.803312 494 37.549669,55.781575 495 37.467105,55.771985 496 37.53437,55.88977 497 37.433948,55.722795999999995 498 37.749831,55.693256999999996 499 37.648663,55.746568 500 37.235699,55.983332999999995 error 501 37.809084000000006,55.799057 502 37.77997,55.801966 503 37.654781,55.672702 504 37.375665000000005,55.883848 error 505 37.630086,55.724353 506 37.599866999999996,55.694809 507 37.571282000000004,55.505021 508 37.628586,55.714642000000005 509 37.605382,55.697361 510 37.700523,55.798662 511 37.700083,55.792922999999995 512 36.947447,56.186504000000006 error 513 37.630131,55.247364000000005 error 514 37.655338,55.825906999999994 515 37.667025,55.71964200000001 516 37.570258,55.702946999999995 517 37.607206,55.654532999999994 error 518 37.566189,55.50055 error 519 37.580858,55.73188100000001 520 37.629313,55.725889 521 37.782638,55.752764 522 37.599759000000006,55.78754300000001 523 37.650163,55.765443000000005 524 37.512595000000005,55.874748 525 37.741611999999996,55.731004000000006 526 37.339957,55.6388 527 37.665524,55.618329 528 37.86372,55.739183999999995 529 37.67484,55.728287 530 37.720915000000005,55.744941000000004 531 37.300018,55.472689 532 37.652867,55.86910699999999 533 37.664402,55.78155 534 37.779385999999995,55.749547 535 37.581289,55.795727 536 37.715534000000005,55.756452 537 37.566144,55.864773 538 37.515415999999995,55.674372 539 37.640228,55.75644200000001 error 540 37.607143,55.65388299999999 error 541 37.452758,55.831817 542 37.524184000000005,55.859716000000006 543 37.640192,55.809565 544 37.747639,55.694672 545 37.794406,55.794810999999996 546 37.417284,55.771260999999996 547 37.563233000000004,55.745549 548 37.516368,55.822053000000004 549 37.579133,55.5687 550 37.717859999999995,55.649809 551 37.562182,55.744622 552 37.159306,55.976589000000004 error 553 37.721678000000004,55.800985 554 37.525145,55.64509 555 37.67634,55.707283999999994 556 37.749059,55.69941600000001 557 37.406648,55.797847 558 37.567806,55.845293999999996 559 37.404178,55.648499 560 37.58491,55.899356000000004 561 37.35203,55.847744999999996 562 37.238744,55.98426 error 563 37.467105,55.783524 564 37.534712,55.54919 565 37.615165000000005,55.713938 566 37.71027,55.87244499999999 567 37.571704,55.789325 568 37.653604,55.590810999999995 569 37.848125,55.699177 570 37.510331,55.48603000000001 571 37.348895,55.32563100000001 572 37.22526,55.519075 573 37.275259999999996,55.431228000000004 574 37.190253000000006,55.413540000000005 575 37.185357,55.313629000000006 576 37.345822999999996,55.596807999999996 577 36.942003,55.464861 578 37.481072999999995,55.568394999999995 error 579 37.351348,55.519723 580 37.162351,55.534597 581 37.536553000000005,55.474596999999996 582 37.802949,55.63740799999999 583 37.796184000000004,55.75786 584 37.763719,55.652679000000006 585 37.517608,55.672940000000004 586 37.674319,55.727952 587 37.469,55.802831000000005 588 37.524471000000005,55.835806000000005 589 37.74375,55.672351 590 37.547306,55.799826 591 37.589015,55.815746999999995 592 37.572576,55.818158999999994 593 37.815408000000005,55.791552 594 37.406648,55.797847 595 37.441673,55.847942 596 37.581164,55.72056 597 37.684865,55.879318999999995 598 37.650954,55.679285 599 37.581325,55.719338 600 37.514571999999994,55.794047 601 37.706865,55.61281700000001 602 37.159306,55.976589000000004 error 603 37.629313,55.725889 604 37.467787,55.802604 605 37.775828999999995,55.702830000000006 606 37.715534000000005,55.756452 607 37.35203,55.847744999999996 608 37.294017,55.474990000000005 609 37.606343,55.772375 610 37.467787,55.802604 611 37.822666999999996,55.81835600000001 612 37.639446,55.763138 613 37.585745,55.900103 614 37.606811,55.866177 615 37.586976,55.616814 616 37.411463,55.733528 617 37.500791,55.623076 618 37.373141,55.591666000000004 619 37.162351,55.534597 620 37.544243,55.475817000000006 621 37.487703,55.540654 622 37.515541999999996,55.739189 623 37.6198,55.724824 624 37.467105,55.771985 625 37.815336,55.756579 626 37.450179999999996,55.400864 627 37.540003000000006,55.754633 628 37.642599,55.859083999999996 629 37.705490000000005,55.758564 630 37.584407,55.76511899999999 631 37.697424,55.786961 632 37.767268,55.682463 633 37.405795,55.853759 634 37.531909000000006,55.827631000000004 635 37.230345,55.984053 error 636 37.650478,55.632205000000006 637 37.50178,56.23542 638 37.588808,55.76029200000001 639 37.589033,55.749866000000004 640 37.602067,55.783848 641 37.604987,55.748615 642 37.564931,55.725803000000006 643 37.64268,55.78035 644 37.681263,55.736741 645 37.674704999999996,55.78246600000001 646 37.677975,55.769276 647 37.595760999999996,55.787705 648 37.596965000000004,55.779737 649 37.663243,55.752607 650 37.64374,55.763554000000006 651 37.596246,55.777969999999996 652 37.604592,55.754735 653 37.633589,55.76474399999999 654 37.604906,55.760631000000004 655 37.625935999999996,55.772542 656 37.562227,55.758590000000005 657 37.580912,55.751249 658 37.603505,55.741333 659 37.597163,55.754142 660 37.664823999999996,55.743795999999996 661 37.63729,55.787548 662 37.629215,55.729012 663 37.68465,55.735302000000004 664 37.651987,55.737613 665 37.627642,55.726051 666 37.602436,55.757941 667 37.687497,55.770993000000004 668 37.672594000000004,55.735125 669 37.649265,55.764941 670 37.555723,55.759409999999995 671 37.57943,55.722223 672 37.614734000000006,55.759653 673 37.635071999999994,55.724489 674 37.672594000000004,55.735125 675 37.606784000000005,55.783818000000004 676 37.646345000000004,55.743613 677 37.632089,55.732032999999994 678 37.605068,55.750803000000005 679 37.64268,55.78035 680 37.58226,55.772573 681 37.592599,55.73483100000001 682 37.621435,55.744170999999994 683 37.637596,55.745605000000005 error 684 37.594755,55.756756 685 37.607044,55.770031 686 37.593983,55.738758999999995 687 37.584451,55.76635400000001 688 37.655634,55.760373 689 37.687973,55.768851 690 37.590192,55.753493999999996 691 37.637919000000004,55.767914000000005 692 37.592213,55.786919999999995 693 37.563521,55.760165 694 37.672666,55.772998 695 37.637209999999996,55.743634 error 696 37.593938,55.74784399999999 697 37.686662,55.778877 698 37.637389,55.752293 699 37.547028000000005,55.763417000000004 700 37.571471,55.737015 701 37.559684999999995,55.815741 702 37.570132,55.74677 703 37.61963,55.697163 704 37.6698,55.784364000000004 705 37.671624,55.723268000000004 706 37.652445,55.883772 707 37.559684999999995,55.815741 708 37.496515,55.809975 709 37.570716,55.861166000000004 710 37.54241,55.773601 711 37.518138,55.80104 712 37.500612,55.805523 713 37.535475,55.836888 714 37.504321999999995,55.821386 715 37.501609,55.855588 716 37.506783,55.794143000000005 717 37.520914000000005,55.796385 718 37.531702,55.78436899999999 719 37.568929,55.813334 720 37.529367,55.822883 721 37.503064,55.862196 722 37.555571,55.875178000000005 723 37.534191,55.86721800000001 724 37.496192,55.81823000000001 725 37.494575,55.849782 726 37.523348,55.798519999999996 727 37.481145,55.845895 728 37.535233000000005,55.800934 729 37.473267,55.85609300000001 730 37.484406,55.837803 731 37.489787,55.86608100000001 732 37.54833,55.805907 733 37.56883,55.780016 734 37.504196,55.822079 735 37.515461,55.798272 736 37.514059,55.778866 737 37.468515000000004,55.868182 738 37.562694,55.877343999999994 739 37.519306,55.874339 740 37.575298,55.812003000000004 741 37.566359000000006,55.87248100000001 742 37.539679,55.875395 743 37.527229,55.83846 744 37.49064,55.871334 745 37.516,55.822711 746 37.546057,55.778674 747 37.526016,55.839016 748 37.55982,55.782365000000006 749 37.57713,55.78915799999999 750 37.524749,55.821861 751 37.565452,55.844035999999996 752 37.485197,55.829699 753 37.56644,55.857801 754 37.561437,55.868263 755 37.560753999999996,55.808446999999994 756 37.561895,55.881636 757 37.521857000000004,55.882172 758 37.347027000000004,55.945685 759 37.552803999999995,55.870799 760 37.504861,55.817420999999996 761 37.516844,55.846851 762 37.491009000000005,55.829112 763 37.53437,55.882611 764 37.492446,55.882389 765 37.523034,55.85902900000001 766 37.574399,55.797291 767 37.573474,55.79229599999999 768 37.540003000000006,55.892309 769 37.560763,55.891451 770 37.519225,55.827661 771 37.493263,55.817502000000005 772 37.541871,55.800084 773 37.559684999999995,55.815741 774 37.570132,55.74677 775 37.541871,55.800084 776 37.484559000000004,55.680721999999996 777 37.464203000000005,55.718141 778 37.474731,55.706543 779 37.351078,55.640985 780 37.399506,55.736194 781 37.509128000000004,55.697990000000004 782 37.399964000000004,55.646584 783 37.492733,55.658149 784 37.523365999999996,55.741409 785 37.428926000000004,55.745123 786 37.371326,55.641615 787 37.422098999999996,55.724753 788 37.465802000000004,55.661983 789 37.414176,55.737030000000004 790 37.523231,55.727759 791 37.504025,55.703270999999994 792 37.498599,55.747454000000005 793 37.473698,55.725554 794 37.406531,55.657534999999996 795 37.492805,55.672757 796 37.495419,55.740446 797 37.491359,55.764425 798 37.40433,55.76231800000001 799 37.411526,55.721016000000006 800 37.500405,55.690461 801 37.507026,55.694124 802 37.461095,55.716595 803 37.495096000000004,55.737821 804 37.493533,55.684045999999995 805 37.446011999999996,55.677473 806 37.483616,55.653101 807 37.408328000000004,55.741647 808 37.495446,55.664426 809 37.412721000000005,55.757536 810 37.493075,55.744859999999996 811 37.462694,55.736259999999994 812 37.465002,55.668935 813 37.345616,55.64520699999999 814 37.410583,55.742939 815 37.469665,55.653304000000006 816 37.341206,55.6486 817 37.455983,55.71448 818 38.127178,55.920668000000006 error 819 37.504483,55.672807999999996 820 37.513556,55.709272 821 37.394,55.73885500000001 822 37.512648999999996,55.70249499999999 823 37.41467,55.764648 824 37.490003,55.696991000000004 825 37.294717999999996,55.614245999999994 error 826 37.549588,55.746607999999995 827 37.412836999999996,55.7559 828 37.456226,55.712045999999994 829 37.504762,55.672169 830 37.39744,55.708415 831 37.428827000000005,55.721548999999996 832 37.455408,55.725731999999994 833 37.423509,55.732352 834 37.405049,55.717224 835 37.457285999999996,55.670965 836 37.491611,55.664299 837 37.439706,55.731997 838 37.390603999999996,55.65773299999999 839 37.402228,55.652882999999996 840 37.36352,55.63909 841 37.417832000000004,55.750868999999994 842 37.415981,55.716174 843 37.341376000000004,55.642596 844 37.380992,55.634278 845 37.559892,55.745205000000006 846 37.347656,55.638866 847 37.413646,55.770517000000005 848 37.5183,55.738662 849 37.455543,55.666442 850 37.863369,55.737795999999996 851 37.725046999999996,55.77551 852 37.782135,55.743198 853 37.829512,55.824577000000005 854 37.786941,55.761435999999996 855 37.830203999999995,55.760282 856 37.728703,55.7956 857 37.831767,55.81652 858 37.793157,55.793723 859 37.82546,55.742732 860 37.688126000000004,55.80376700000001 error 861 37.837992,55.76209 862 37.795744,55.793743000000006 863 37.830114,55.718187 864 37.684775,55.793141000000006 865 37.783635,55.759527 866 37.827841,55.804855 867 37.711779,55.80846700000001 868 37.813243,55.753129 869 37.792753000000005,55.74746999999999 870 37.806298999999996,55.80729399999999 871 37.859013,55.742371999999996 872 37.740812,55.78978000000001 873 37.759803000000005,55.806651 874 37.874787,55.744960999999996 875 37.701879,55.812787 876 37.776745,55.824318999999996 877 37.824490000000004,55.80129300000001 878 37.827257,55.732944999999994 879 37.732386,55.781955 880 37.890831,55.710058 881 37.88704,55.710453 882 37.762668,55.7426 883 37.796562,55.790676 884 37.786266999999995,55.754993000000006 885 37.715022,55.811776 886 37.883671,55.717366000000005 887 37.814717,55.793915000000005 888 37.684765999999996,55.789775 889 37.820196,55.754856000000004 890 37.804072,55.813329 891 37.779628,55.80809300000001 892 37.738288,55.780066000000005 893 37.752975,55.827085 894 37.834821000000005,55.72398199999999 895 37.831156,55.776912 896 37.810414,55.807486 897 37.872101,55.741859999999996 898 37.685241999999995,55.793094999999994 899 37.852769,55.735439 900 37.817834000000005,55.822084 901 37.761276,55.829067 902 37.836645000000004,55.781023 903 37.815301,55.80389399999999 904 37.728586,55.813506000000004 905 37.696759,55.816293 906 37.720286,55.80939300000001 907 37.715686,55.818088 908 37.786411,55.805579 909 37.835692,55.77316999999999 910 37.797038,55.758499 911 37.706164,55.783590000000004 912 37.792519,56.003417000000006 913 37.827419,55.754405000000006 914 37.866585,55.819545 error 915 37.825451,55.768693999999996 916 37.806407,55.724357999999995 917 37.832827,55.74090699999999 918 37.778218,55.746669 919 37.826898,55.763179 920 37.863585,55.819762 error 921 37.85259,55.71338000000001 error 922 37.818265000000004,55.813061 923 37.807978999999996,55.818887 924 37.735261,55.809398 925 37.792609000000006,55.790074 926 37.864627,55.7035 927 37.80338,55.750459 928 37.784803000000004,55.79760400000001 929 37.85047,55.738987 930 37.72051,55.801708 931 37.76999,55.668686 932 37.712812,55.884115 933 37.61963,55.697163 934 37.541871,55.800084 935 37.76999,55.668686 936 37.700002000000005,55.67722 937 37.709236,55.60546 938 37.723358000000005,55.626614000000004 939 37.616593,55.718623 940 37.649103000000004,55.720966000000004 941 37.629754,55.680336 942 37.702337,55.623326 943 37.682134000000005,55.685802 944 37.625648,55.714328 945 37.663925,55.70806999999999 946 37.620968,55.60234200000001 947 37.668848,55.682559 948 37.738818,55.617154000000006 949 37.72917,55.606848 950 37.674678,55.640878 951 37.641378,55.584543000000004 952 37.719908000000004,55.624596 953 37.714806,55.606761 954 37.645276,55.577739 955 37.736967,55.60831700000001 956 37.667995,55.591126 957 37.72573,55.616163 958 37.674552,55.58497 959 37.657907,55.714414 960 37.69542,55.675966 961 37.604331,55.629684 962 37.612308,55.658439 error 963 37.680077000000004,55.577989 964 37.742187,55.634568 965 37.659973,55.642219999999995 966 37.75497,55.620337 967 37.717115,55.601746999999996 968 37.759282,55.631341000000006 969 37.681298999999996,55.67663100000001 970 37.59657,55.634852 971 37.59339,55.599641000000005 972 37.656586,55.681087 973 37.674067,55.628783999999996 974 37.613728,55.646172 error 975 37.621579,55.663918 976 37.653748,55.668634999999995 977 37.697478000000004,55.639801 978 37.675271,55.629816000000005 979 37.746588,55.61960500000001 980 37.659182,55.646471999999996 981 37.601268,55.617805000000004 982 37.595968,55.609701 983 37.631775,55.676605 984 37.626645,55.65999300000001 985 37.724022999999995,55.616275 986 37.671929,55.679269999999995 987 37.687515000000005,55.68091999999999 988 37.655634,55.70473199999999 989 37.655615999999995,55.600501 990 37.734084,55.623697 991 37.619701,55.708912 992 37.585368,55.616778000000004 993 37.614832,55.71756800000001 994 37.595159,55.587687 995 37.619818,55.60566800000001 996 37.606721,55.627976000000004 997 37.60823,55.636285 998 37.755715,55.636956000000005 999 37.653397,55.62111899999999 1000 37.663368,55.624179000000005 1001 37.733581,55.62301 1002 37.588646999999995,55.609665 1003 37.665488,55.633414 1004 37.605247,55.591421 1005 37.58579,55.599265 1006 37.65143,55.581927 1007 37.688782,55.581062 1008 37.701134,55.619243999999995 1009 37.753847,55.608810999999996 1010 37.774184999999996,55.63949100000001 1011 37.745825,55.602927 1012 37.766163,55.639933 1013 37.681227,55.684143000000006 1014 37.594297,55.616864 1015 37.609146,55.638180000000006 1016 37.614428000000004,55.624896 1017 37.743049,55.635406 1018 37.640075,55.59163 1019 37.608302,55.652075 error 1020 37.717869,55.636199 1021 37.617653000000004,55.59954499999999 1022 37.60735,55.718953000000006 1023 37.6698,55.784364000000004 1024 37.60735,55.718953000000006 1025 37.487029,55.630878 1026 37.555139000000004,55.702901000000004 1027 37.532771000000004,55.544748999999996 1028 37.556442,55.69798 1029 37.566952,55.67261 1030 37.57484,55.706741 1031 37.543587,55.601828000000005 1032 37.526816,55.685056 1033 37.612973,55.641656000000005 1034 37.519242999999996,55.540501 1035 37.579744,55.690654 1036 37.532331,55.636361 1037 37.593003,55.69195799999999 1038 37.507295,55.63086800000001 1039 37.491988,55.622466 1040 37.539320000000004,55.680087 1041 37.559703000000006,55.65209 1042 37.522521999999995,55.628972 1043 37.603918,55.663639 error 1044 37.579008,55.675017000000004 1045 37.524013000000004,55.68326 1046 37.525001,55.663563 1047 37.511984000000005,55.657362 1048 37.516647,55.63764200000001 1049 37.580256,55.656936 1050 37.590057,55.671564000000004 1051 37.525001,55.64984499999999 1052 37.532277,55.662887 1053 37.528774,55.532481999999995 1054 37.582358,55.565763000000004 1055 37.534101,55.669194 1056 37.558265999999996,55.699070999999996 1057 37.502813,55.533522 1058 37.578981,55.50338000000001 1059 37.574327000000004,55.685092000000004 1060 37.548905,55.695073 1061 37.554376,55.676843999999996 1062 37.5334,55.614953 1063 37.563844,55.548136 1064 37.570608,55.565376 1065 37.559038,55.662293000000005 1066 37.528334,55.635177 1067 37.588575,55.65656 error 1068 37.577822,55.54053100000001 1069 37.475701,55.640467 1070 37.559047,55.664634 1071 37.495284999999996,55.534591000000006 1072 37.549633,55.666929 1073 37.53402,55.643443999999995 1074 37.482214,55.644089 1075 37.581595,55.567306 1076 37.54038,55.592082999999995 1077 37.529654,55.686980000000005 1078 37.549085,55.66995 1079 37.571579,55.69008 1080 37.595483,55.643866 error 1081 37.577139,55.652283 1082 37.553756,55.5448 1083 37.477606,55.633297 1084 37.552436,55.606065 1085 37.56892,55.551726 1086 37.575603,55.5636 1087 37.523249,55.67126999999999 1088 37.50778,55.540491 1089 37.586696999999994,55.573948 1090 37.544494,55.612593999999994 1091 37.547189,55.54946999999999 1092 37.584685,55.570471999999995 1093 37.530076,55.549322 1094 37.498653000000004,55.64605 1095 37.517491,55.605536 1096 37.563753999999996,55.669315000000005 1097 37.517266,55.59794300000001 1098 37.595034000000005,55.65434499999999 error 1099 37.576133,55.684884 1100 37.559684999999995,55.815741 1101 37.671624,55.723268000000004 1102 37.76999,55.668686 1103 37.60735,55.718953000000006 1104 37.720043,55.732352 1105 37.716432,55.733827000000005 1106 37.767590999999996,55.672001 1107 37.741288,55.738966000000005 1108 37.71998,55.690872 1109 37.720321999999996,55.740669 1110 37.719334,55.74466700000001 1111 37.823745,55.707588 1112 37.753146,55.713253 1113 37.751314,55.665203000000005 1114 37.847829,55.683893999999995 1115 37.776269,55.660541 1116 37.764276,55.672529000000004 1117 37.735566,55.651516 1118 37.920808,55.684346 1119 37.748681,55.647670999999995 1120 37.771211,55.707765 1121 37.92644,55.682503000000004 1122 37.769666,55.672062 1123 37.766738000000004,55.711583999999995 1124 37.748996000000005,55.716345999999994 1125 37.855383,55.680488000000004 1126 37.777967,55.666853 1127 37.792411,55.714389000000004 1128 37.682862,55.70020699999999 1129 37.744648,55.700775 1130 37.75691,55.704443000000005 1131 37.777104,55.661928 1132 37.84534,55.701501 1133 37.752176,55.714653000000006 1134 37.67917,55.751852 1135 37.799876,55.695012 1136 37.764654,55.660140000000006 1137 37.814878,55.700796 1138 37.722487,55.649048 1139 37.923116,55.688120999999995 1140 37.689778999999994,55.757364 1141 37.727022999999996,55.680265000000006 1142 37.760045,55.652283 1143 37.774813,55.700547 1144 37.820062,55.697681 1145 37.792941,55.718689000000005 1146 37.741351,55.674966000000005 1147 37.701017,55.757394 1148 37.742124,55.70601 1149 37.771463,55.678895 1150 37.740938,55.701227 1151 37.719648,55.683944999999994 1152 37.729359,55.688 1153 37.770034,55.728368 1154 37.757278,55.710854000000005 1155 37.809686,55.674255 1156 37.742276000000004,55.67825 1157 37.75108,55.686335 1158 37.737623,55.643917 1159 37.767492,55.663679 1160 37.851242,55.691542000000005 1161 37.774516999999996,55.665259 1162 37.745933,55.668787 1163 37.860019,55.682590000000005 1164 37.849759999999996,55.689161999999996 1165 37.862282,55.686462 1166 37.76981,55.655427 1167 37.776412,55.66372 1168 37.797334,55.63158000000001 1169 37.918544,55.701668000000005 1170 37.919002,55.705721 1171 37.736896,55.71749200000001 1172 37.789393,55.667933999999995 1173 37.718732,55.643287 1174 37.751987,55.67926 1175 37.721265,55.66800500000001 1176 37.938181,55.703718 1177 37.652445,55.883772 1178 37.712812,55.884115 1179 37.683265999999996,55.884822 1180 37.618272999999995,55.877602 1181 37.626653999999995,55.817537 1182 37.670483000000004,55.872193 1183 37.592923,55.85949399999999 1184 37.691064000000004,55.879884 1185 37.642887,55.874511 1186 37.72034,55.880883999999995 1187 37.608895000000004,55.86056 1188 37.642644,55.867465 1189 37.6524,55.87866700000001 1190 37.719172,55.874258 1191 37.570159000000004,55.894636 1192 37.592087,55.827808 1193 37.654089,55.868162 1194 37.616207,55.895615 1195 37.662794,55.818006999999994 1196 37.6509,55.889759999999995 1197 37.635107,55.80364599999999 1198 37.633068,55.803702 1199 37.641836,55.810324 1200 37.613485,55.864439000000004 1201 37.642185999999995,55.852799 1202 37.552957,55.906622999999996 1203 37.645025,55.803175 1204 37.610206,55.889649 1205 37.594405,55.883989 1206 37.691646999999996,55.87279399999999 1207 37.617545,55.896846999999994 1208 37.624525,55.824728 1209 37.621615000000006,55.893172 1210 37.601690000000005,55.890977 1211 37.668426000000004,55.859266000000005 1212 37.653128,55.827403000000004 1213 37.693471,55.884232 1214 37.635377000000005,55.867051000000004 1215 37.660727,55.835432 1216 37.64348,55.833602 1217 37.575055,55.824631999999994 1218 37.601366999999996,55.86653100000001 1219 37.611958,55.795908999999995 1220 37.696364,55.873799 1221 37.621094,55.817632999999994 1222 37.641602,55.874264000000004 1223 37.690426,55.852789 1224 37.643381,55.825027 1225 37.581388000000004,55.89344499999999 1226 37.584002000000005,55.903448 1227 37.670932,55.88928000000001 1228 37.580014,55.875455 1229 37.556307000000004,55.935113 1230 37.589822999999996,55.896251 1231 37.578029,55.900567 1232 37.542671,55.926993 1233 37.470913,55.80438 1234 37.430139000000004,55.846740000000004 1235 37.46458,55.781185 1236 37.48384,55.780502 1237 37.360457000000004,55.83025500000001 1238 37.446883,55.857457 1239 37.476339,55.786570999999995 1240 37.34682,55.856492 1241 37.453163,55.785078000000006 1242 37.412496000000004,55.807390000000005 1243 37.482214,55.772845999999994 1244 37.381405,55.839749 1245 37.359513,55.836059 1246 37.456037,55.846557999999995 1247 37.40486,55.797063 1248 37.457124,55.800194999999995 1249 37.41935,55.806616000000005 1250 37.465711999999996,55.786354 1251 37.382393,55.900128 1252 37.3523,55.846249 1253 37.361211,55.841397 1254 37.42686,55.856694 1255 37.47156,55.769524 1256 37.448662,55.833814000000004 1257 37.382825,55.903973 1258 37.349183000000004,55.842378000000004 1259 37.410088,55.858589 1260 37.487164,55.799133 1261 37.40274,55.80731899999999 1262 37.348482000000004,55.85500699999999 1263 37.444736,55.828576 1264 37.477336,55.780460999999995 1265 37.398464000000004,55.81578199999999 1266 37.394771999999996,55.810283999999996 1267 37.394934,55.802305000000004 1268 37.413321999999994,55.855047 1269 37.459352,55.833091 1270 37.431521999999994,55.860438 1271 37.452327000000004,55.807117000000005 1272 37.444018,55.848316000000004 1273 37.400791,55.79681 1274 37.364939,55.847503 1275 37.357762,55.850832999999994 1276 37.463143,55.803074 1277 37.392247999999995,55.886963 1278 37.397575,55.894515000000006 1279 37.231566,55.998000000000005 error 1280 37.190765,55.976302000000004 error 1281 37.153690999999995,55.979903 error 1282 37.191142,55.967808999999995 error 1283 37.192246999999995,55.98500500000001 error 1284 37.155614,55.987442 error 1285 37.164956,55.9822 error 1286 37.202524,55.995281999999996 error 1287 37.220921000000004,55.997985 error 1288 37.207653,55.993877000000005 error 1289 37.192687,55.993248 error 1290 37.186138,55.984556999999995 error 1291 37.211821,56.005848 error 1292 37.186138,55.997149 error 1293 37.228314000000005,55.99153100000001 error 1294 37.153323,55.975531000000004 error 1295 37.176518,55.987352 error 1296 37.153682,55.98100600000001 error 1297 37.422674,55.557536 1298 37.332097,55.505545999999995 1299 37.309208,55.622039 1300 37.160788000000004,55.597820999999996 1301 37.346802000000004,55.59550600000001 1302 37.480669,55.571957999999995 error 1303 37.541,55.469255000000004 1304 37.360295,55.600776 1305 37.57006,55.511770999999996 1306 37.531118,55.514773 1307 37.576133,55.684884 1308 37.299695,55.490136 1309 36.870983,55.430222 error 1310 37.181656,55.313926 1311 37.268244,55.42635 1312 37.300799,55.474362 error 1313 37.517472999999995,55.934180000000005 1314 37.739186,55.358693 error 1315 38.127402000000004,55.60020600000001 1316 38.776525,55.074592
objects.to_csv(r'objects.csv')
X = objects[["Latitude","Longitude"]]
max_k = 100
# iterations
distortions = []
for i in range(1, max_k+1):
if len(X) >= i:
model = cluster.KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
model.fit(X)
distortions.append(model.inertia_)
# best k: the lowest derivative
k = [i*100 for i in np.diff(distortions,2)].index(min([i*100 for i in np.diff(distortions,2)]))
# plot
fig, ax = plt.subplots()
ax.plot(range(1, len(distortions)+1), distortions)
ax.axvline(k, ls='--', color="red", label="k = "+str(k))
ax.set(title='The Elbow Method', xlabel='Number of clusters', ylabel="Distortion")
ax.legend()
ax.grid(True)
plt.show()
k = 6
model = cluster.KMeans(n_clusters=k, init='k-means++')
X = objects[["Latitude","Longitude"]]
# clustering
objects_X = X.copy()
objects_X["cluster"] = model.fit_predict(X)
# find real centroids
closest, distances = scipy.cluster.vq.vq(model.cluster_centers_,
objects_X.drop("cluster", axis=1).values)
objects_X["centroids"] = 0
for i in closest:
objects_X["centroids"].iloc[i] = 1
# add clustering info to the original dataset
objects[["cluster","centroids"]] = objects_X[["cluster","centroids"]]
objects.sample(5)
/Users/maxim/opt/anaconda3/lib/python3.8/site-packages/pandas/core/indexing.py:670: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy iloc._setitem_with_indexer(indexer, value)
| index | ObjectName | AdmArea | District | Address | Category | Longitude | Latitude | cluster | centroids | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1132 | 494 | Школа № 1359 имени авиаконструктора М.Л. Миля | Юго-Восточный административный округ | район Выхино-Жулебино | Пронская улица, дом 4, корпус 1 | School | 37.845340 | 55.701501 | 2 | 0 |
| 426 | 426 | Фитнес клуб «Вандерфит фитнес» | Западный административный округ | район Кунцево | Рублёвское шоссе, дом 101, корпус 3 | Pools | 37.421497 | 55.741490 | 0 | 0 |
| 363 | 363 | Спортивный комплекс дошкольного образовательно... | Юго-Восточный административный округ | район Выхино-Жулебино | улица Авиаконструктора Миля, дом 13, корпус 2 | Pools | 37.858204 | 55.681965 | 2 | 0 |
| 1087 | 449 | Школа № 1311 | Юго-Западный административный округ | Обручевский район | Ленинский проспект, д. 97, к. 1 | School | 37.523249 | 55.671270 | 5 | 0 |
| 877 | 239 | Школа самоопределения № 734 имени А.Н. Тубельс... | Восточный административный округ | район Восточное Измайлово | Сиреневый бульвар, дом 58А | School | 37.824490 | 55.801293 | 2 | 0 |
fig, ax = plt.subplots()
fig = plt.gcf()
# Change seaborn plot size
fig.set_size_inches(20, 8)
sns.scatterplot(x="Latitude", y="Longitude", data=objects,
palette=sns.color_palette("bright",k),
hue='cluster', size="centroids", size_order=[1,0],
legend="brief", ax=ax).set_title('Clustering (k='+str(k)+')')
th_centroids = model.cluster_centers_
ax.scatter(th_centroids[:,0], th_centroids[:,1], s=50, c='black', marker="x")
<matplotlib.collections.PathCollection at 0x13232e520>
model_affprop = cluster.AffinityPropagation()
k = objects["cluster"].nunique()
fig = plt.gcf()
# Change seaborn plot size
fig.set_size_inches(20, 8)
sns.scatterplot(x="Latitude", y="Longitude", data=objects,
palette=sns.color_palette("bright",k),
hue='cluster', size="centroids", size_order=[1,0],
legend="brief").set_title('Clustering (k='+str(k)+')')
Text(0.5, 1.0, 'Clustering (k=6)')
X = objects[["Latitude","Longitude"]]
map_shape = (5,5)
## scale data
scaler = preprocessing.StandardScaler()
X_preprocessed = scaler.fit_transform(X.values)
## clustering
model_som = MiniSom(x=map_shape[0], y=map_shape[1], input_len=X.shape[1])
model_som.train_batch(X_preprocessed, num_iteration=100, verbose=False)
## build output dataframe
objects_X = X.copy()
objects_X["cluster"] = np.ravel_multi_index(np.array([model_som.winner(x) for x in X_preprocessed]).T, dims=map_shape)
cluster_centers = np.array([vec for center in model_som.get_weights() for vec in center])
## find real centroids
cluster_centers = np.array([vec for center in model_som.get_weights() for vec in center])
closest, distances = scipy.cluster.vq.vq(model.cluster_centers_, X_preprocessed)
objects_X["centroids"] = 0
for i in closest: objects_X["centroids"].iloc[i] = 1
## add clustering info to the original dataset
objects[["cluster","centroids"]] = objects_X[["cluster","centroids"]]
## plot
k = objects["cluster"].nunique()
fig, ax = plt.subplots()
fig = plt.gcf()
# Change seaborn plot size
fig.set_size_inches(20, 8)
sns.scatterplot(x="Latitude", y="Longitude", data=objects,
palette=sns.color_palette("bright",k),
hue='cluster', size="centroids", size_order=[1,0],
legend="brief", ax=ax).set_title('Clustering (k='+str(k)+')')
th_centroids = scaler.inverse_transform(cluster_centers)
ax.scatter(th_centroids[:,0], th_centroids[:,1], s=50, c='black', marker="x")
/Users/maxim/opt/anaconda3/lib/python3.8/site-packages/pandas/core/indexing.py:670: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy iloc._setitem_with_indexer(indexer, value)
<matplotlib.collections.PathCollection at 0x1349252e0>
address = 'Moscow, RU'
geolocator = Nominatim(user_agent="moscow_explorer")
location = geolocator.geocode(address)
latitude = location.latitude
longitude = location.longitude
x, y = "Latitude", "Longitude"
color = "cluster"
popup = "District"
marker = "centroids"
data = objects.copy()
# create color column
lst_elements = sorted(list(objects[color].unique()))
lst_colors = ['#%06X' % np.random.randint(0, 0xFFFFFF) for i in range(len(lst_elements))]
data["color"] = data[color].apply(lambda x: lst_colors[lst_elements.index(x)])
# create size column (scaled)
scaler = preprocessing.MinMaxScaler(feature_range=(3,15))
# initialize the map with the starting location
map_ = folium.Map(location=[latitude, longitude], tiles="cartodbpositron", zoom_start=11)
# add points
data.apply(lambda row: folium.CircleMarker(
location=[row[x],row[y]], popup=row[popup],
color=row["color"], fill=True).add_to(map_), axis=1)
# add html legend
legend_html = """<div style="position:fixed; bottom:10px; left:10px; border:2px solid black; z-index:9999; font-size:12px;"> <b>"""+color+""":</b><br>"""
for i in lst_elements:
legend_html = legend_html+""" <i class="fa fa-circle
fa-1x" style="color:"""+lst_colors[lst_elements.index(i)]+"""">
</i> """+str(i)+"""<br>"""
legend_html = legend_html+"""</div>"""
map_.get_root().html.add_child(folium.Element(legend_html))
map_
for index in range(0,25):
print(objects.loc[objects['cluster'] == index].shape)
(90, 10) (83, 10) (69, 10) (57, 10) (79, 10) (119, 10) (22, 10) (14, 10) (79, 10) (69, 10) (31, 10) (29, 10) (21, 10) (36, 10) (16, 10) (114, 10) (67, 10) (67, 10) (13, 10) (55, 10) (67, 10) (49, 10) (18, 10) (36, 10) (17, 10)
cluster5 = objects.loc[objects['cluster'] == 5]
cluster5.to_csv(r'cluster5.csv')
print('There are {} uniques categories.'.format(len(cluster5['Category'].unique())))
print(cluster5['Category'].unique())
There are 6 uniques categories. ['Pools' 'AdultHospital' 'AdultDentalClinic' 'ChildrenDentalClinic' 'ChildrenHospital' 'School']
cluster5['AdmArea'].unique()
array(['Юго-Восточный административный округ',
'Южный административный округ', 'Курьяновский парк',
'исторический район Волхонка-ЗИЛ',
'Юго-Западный административный округ'], dtype=object)
address = 'Moscow, RU'
geolocator = Nominatim(user_agent="moscow_explorer")
location = geolocator.geocode(address)
latitude = location.latitude
longitude = location.longitude
# create map of Moscow using latitude and longitude values
map_moscow = folium.Map(location=[latitude, longitude], zoom_start=10)
# add markers to map
for lat, lng, name in zip(cluster5['Latitude'], cluster5['Longitude'], cluster5['ObjectName']):
label = '{}'.format(name)
label = folium.Popup(label, parse_html=True)
folium.CircleMarker(
[lat, lng],
radius=5,
popup=label,
color='blue',
fill=True,
fill_color='#3186cc',
fill_opacity=0.7,
parse_html=False).add_to(map_moscow)
map_moscow